home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-06-18 | 12.3 KB | 604 lines | [TEXT/KAHL] |
- /* © 1993 Jon Wätte, Stockholm
- *
- * This is unpublished proprietary source code, and may not be used,
- * released, copied, stored in a retrieval system, modified or shown
- * to anyone else without the copyright holders’ prior written
- * permission.
- *
- * Denna källkod skyddas av upphovsrätt, och klassas som opublicerat
- * hemligt material. Ingen användning, kopiering, avskrivning,
- * vidarebefodring, ändring eller publicering av denna källkod eller
- * del härav får ske utan att skriftligt tillstånd först erhållits från
- * upphovsrättsinnehavaren.
- */
-
- // FolderUtils.c
-
-
- #include "FolderUtils.h"
- #include "h+utils.h"
- #include "TBUtilities.h"
- #include <string.h>
-
- #define CHECK(x) if(err=x){goto erret;}
- #define memcopy(s,d,l) memmove(d,s,l)
-
-
- static CInfoPBRec sInfo ;
- static Str255 sStr ;
- static FSSpec sSpec ;
-
- static Boolean gCancelled = 0 ;
-
-
- short
- GetFolderID ( FSSpec * fss , long * dirID )
- {
- short err ;
-
- if ( ! fss -> name [ 0 ] ) {
- return fss -> parID ;
- }
- BlockClear ( sInfo ) ;
- sInfo . hFileInfo . ioNamePtr = fss -> name ;
- sInfo . hFileInfo . ioDirID = fss -> parID ;
- sInfo . hFileInfo . ioVRefNum = fss -> vRefNum ;
-
- err = PBGetCatInfoSync ( & sInfo ) ;
-
- if ( ! err && ! ( sInfo . hFileInfo . ioFlAttrib & 0x10 ) ) {
- err = dirNFErr ; /* Not a folder */
- }
- if ( ! err ) {
- * dirID = sInfo . hFileInfo . ioDirID ;
- }
- return err ;
- }
-
-
- short
- GetFullPathHandle ( FSSpec * fss , Handle * h )
- {
- Handle tempH = NULL ;
- short err ;
- FSSpec fs = * fss ;
-
- while ( fs . parID > 1 ) {
-
- tempH = NULL ;
-
- // ASSERT ( fs . name [ 0 ] < 32 && fs . name [ 0 ] > 0 ) ;
-
- PtrToHand ( & fs . name [ 1 ] , & tempH , fs . name [ 0 ] ) ;
- CHECK ( MemError ( ) ) ;
- PtrAndHand ( ( void * ) ":" , tempH , 1 ) ;
- CHECK ( MemError ( ) ) ;
- HandAndHand ( * h , tempH ) ;
- CHECK ( MemError ( ) ) ;
- SetHandleSize ( * h , 0L ) ;
- HandAndHand ( tempH , * h ) ;
- CHECK ( MemError ( ) ) ;
- DisposeHandle ( tempH ) ;
- tempH = NULL ;
- CHECK ( GetFolderParent ( & fs , & sSpec ) ) ;
- fs = sSpec ;
- }
- CHECK ( GetVolName ( fs . vRefNum , fs . name ) ) ;
-
- // ASSERT ( fs . name [ 0 ] < 32 && fs . name [ 0 ] > 0 ) ;
-
- PtrToHand ( & fs . name [ 1 ] , & tempH , fs . name [ 0 ] ) ;
- CHECK ( MemError ( ) ) ;
- PtrAndHand ( ( void * ) ":" , tempH , 1 ) ;
- CHECK ( MemError ( ) ) ;
- HandAndHand ( * h , tempH ) ;
- CHECK ( MemError ( ) ) ;
- SetHandleSize ( * h , 0L ) ;
- HandAndHand ( tempH , * h ) ;
- CHECK ( MemError ( ) ) ;
- DisposeHandle ( tempH ) ;
- tempH = NULL ;
-
- if ( ! IsFolder ( fss ) ) {
-
- SetHandleSize ( * h , GetHandleSize ( * h ) - 1 ) ; // Remove colon
- }
-
- return 0 ;
-
- erret :
- if ( tempH ) {
-
- DisposeHandle ( tempH ) ;
- }
- SetHandleSize ( * h , 0L ) ;
-
- return err ;
- }
-
-
- short
- GetFullPathString ( FSSpec * fss , unsigned char * str )
- {
- short err ;
- FSSpec fs = * fss ;
-
- * str = 0 ;
-
- while ( fs . parID > 1 ) {
-
- CopyPString ( fs . name , sStr ) ;
- ConcatPStrings ( sStr , "\P:" ) ;
- ConcatPStrings ( sStr , str ) ;
- CopyPString ( sStr , str ) ;
- CHECK ( GetFolderParent ( & fs , & sSpec ) ) ;
- fs = sSpec ;
- }
- CHECK ( GetVolName ( fs . vRefNum , fs . name ) ) ;
-
- CopyPString ( fs . name , sStr ) ;
- ConcatPStrings ( sStr , "\P:" ) ;
- ConcatPStrings ( sStr , str ) ;
- CopyPString ( sStr , str ) ;
-
- if ( * str == 255 ) {
-
- str [ 1 ] = '…' ;
- }
-
- if ( ! IsFolder ( fss ) ) {
-
- str [ 0 ] -- ;
- }
-
- return 0 ;
-
- erret :
-
- return err ;
- }
-
-
- Boolean
- IsFolder ( FSSpec * fss )
- {
- short err ;
-
- BlockClear ( sInfo ) ;
- CopyPString ( fss -> name , sStr ) ;
-
- sInfo . dirInfo . ioNamePtr = sStr ;
- sInfo . dirInfo . ioVRefNum = fss -> vRefNum ;
- sInfo . dirInfo . ioDrDirID = fss -> parID ;
-
- CHECK ( PBGetCatInfoSync ( & sInfo ) ) ;
-
- return 0x10 == ( sInfo . hFileInfo . ioFlAttrib & 0x10 ) ;
-
- erret :
-
- return 0 ;
- }
-
-
- short
- GetFolderParent ( FSSpec * fss , FSSpec * par )
- {
- short err ;
- BlockClear ( sInfo ) ;
-
- sInfo . dirInfo . ioNamePtr = sStr ;
- sInfo . dirInfo . ioVRefNum = fss -> vRefNum ;
- sInfo . dirInfo . ioDrDirID = fss -> parID ;
- sInfo . dirInfo . ioFDirIndex = -1 ;
-
- CHECK ( PBGetCatInfoSync ( & sInfo ) ) ;
-
- CHECK ( FSMakeFSSpec ( sInfo . dirInfo . ioVRefNum , sInfo . dirInfo . ioDrParID ,
- sStr , par ) ) ;
-
- return 0 ;
-
- erret :
-
- return err ;
- }
-
-
- #define kGetDirList 7
- #define kGetDirBTN 10
- #define kGetDirPrompt 11
- #define kNewDirBTN 12
- #define kGetFolderDLOG 210
-
- static Boolean gDirSelectionFlag = 0 ;
- static Str255 gPrevSelectedName ;
- static Str32 gSelDirStrOne , gSelDirStrTwo ;
- static unsigned char * gPromptString = NULL ;
-
- static short gVRefNum ;
- static long gDirID ;
-
-
- // Filter out files
- //
- static pascal Boolean
- MyCustomGetDirectoryFileFilter ( CInfoPBPtr myPB , Ptr myDataPtr )
- {
- return ! ( myPB -> hFileInfo . ioFlAttrib & 0x10 ) ;
- }
-
- // Set the button title ( Select “foldername” )
- //
- static void
- SetButtonTitle ( Handle buttonHandle , unsigned char * name , Rect * buttonRect )
- {
- short resultCode ;
- short width ;
- Str255 conc ;
-
- memcopy ( name , gPrevSelectedName , name [ 0 ] + 1 ) ;
-
- width = buttonRect -> right - buttonRect -> left - ( StringWidth ( gSelDirStrOne ) +
- StringWidth ( gSelDirStrTwo ) ) ;
- resultCode = TruncString ( width , name , smTruncMiddle ) ;
-
- if ( resultCode < 0 ) { // Error : 1 - truncated, 0 - unchanged, <0 - error
-
- SetCTitle ( ( ControlHandle ) buttonHandle , name ) ;
-
- } else {
-
- memcopy ( gSelDirStrOne , conc , gSelDirStrOne [ 0 ] + 1 ) ;
- memcopy ( name + 1 , conc + conc [ 0 ] + 1 , name [ 0 ] ) ;
- conc [ 0 ] += name [ 0 ] ;
- memcopy ( gSelDirStrTwo + 1 , conc + conc [ 0 ] + 1 , gSelDirStrTwo [ 0 ] ) ;
- conc [ 0 ] += gSelDirStrTwo [ 0 ] ;
- SetCTitle ( ( ControlHandle ) buttonHandle , conc ) ;
- }
-
- ValidRect ( buttonRect ) ;
- }
-
-
- static void
- MakeNewFolder ( void )
- {
- DialogPtr dp = NULL ;
- Handle h ;
- Rect r ;
- short k , itemHit ;
- Str255 s ;
- long id ;
- GrafPtr oldP ;
-
- GetPort ( & oldP ) ;
-
- dp = GetNewDialog ( 211 , NULL , NULL ) ;
- if ( ! dp ) {
-
- SysBeep ( 20 ) ;
- return ;
- }
-
- GetDItem ( dp , 4 , & k , & h , & r ) ;
- SetDItem ( dp , 4 , k , ( Handle ) FrameItem , & r ) ;
- SelIText ( dp , 3 , 0 , 32767 ) ;
- SelectWindow ( dp ) ;
- ShowWindow ( dp ) ;
- SetPort ( dp ) ;
- do {
-
- ModalDialog ( NULL , & itemHit ) ;
- GetDItem ( dp , 3 , & k , & h , & r ) ;
- GetIText ( h , s ) ;
- if ( s [ 0 ] ) {
-
- int i , flag = 0 ;
-
- if ( s [ 1 ] == '.' ) {
-
- s [ 1 ] = '•' ;
- flag = 1 ;
- }
- for ( i = 1 ; i <= s [ 0 ] ; i ++ ) {
-
- if ( s [ i ] == ':' ) {
-
- s [ i ] = '•' ;
- flag = 1 ;
- }
- }
- if ( flag ) {
-
- SetIText ( h , s ) ;
- }
- }
- } while ( itemHit != 1 && itemHit != 2 ) ;
-
- if ( itemHit == 1 && s [ 0 ] ) {
-
- if ( DirCreate ( - SFSaveDisk , CurDirStore , s , & id ) ) {
-
- SysBeep ( 20 ) ;
- }
- }
- DisposeDialog ( dp ) ;
-
- SetPort ( oldP ) ;
- }
-
-
- // Hook into the modal dialog to check what items come & go
- //
- static pascal short
- MyCustomGetDirectoryDlogHook ( short item , DialogPtr theDialog ,
- StandardFileReply * mySFRPtr )
- {
- Handle h ;
- short kind ;
- Rect r ;
- Str255 selectedName ;
- CInfoPBRec pb ;
- OSErr err ;
- short retVal = item ;
-
- // CustomGet calls dialog hook for both
- // main and subsidiary dialog boxes. Check
- // here that the refCon indicates dialog
- // record describes main dialog box
-
- if ( GetWRefCon ( theDialog ) == sfMainDialogRefCon ) {
-
- // if ( item == //•
- GetDItem ( theDialog , kGetDirBTN , & kind , & h , & r ) ;
-
- if ( item == sfHookFirstCall ) {
-
- // Set the static text item
-
- GetDItem ( theDialog , kGetDirPrompt , & kind , & h , & r ) ;
- SetIText ( ( Handle ) h , gPromptString ) ;
-
- // Dont forget to set the handle back
-
- GetDItem ( theDialog , kGetDirBTN , & kind , & h , & r ) ;
-
- // determine current folder name and
- // set title of button to select it
-
- pb . hFileInfo . ioCompletion = NULL ;
- pb . hFileInfo . ioNamePtr = selectedName ;
- pb . hFileInfo . ioVRefNum = - SFSaveDisk ;
- pb . hFileInfo . ioFDirIndex = -1 ;
- pb . hFileInfo . ioDirID = CurDirStore ;
-
- err = PBGetCatInfo ( & pb , 0 ) ;
- gVRefNum = pb . hFileInfo . ioVRefNum ;
- gDirID = pb . dirInfo . ioDrParID ;
-
- if ( err ) {
- gDirSelectionFlag = 0 ;
- } else {
- gDirSelectionFlag = 1 ;
- }
- SetButtonTitle ( h , selectedName , & r ) ;
-
- } else {
-
- // track name of folder that can be selected
-
- if ( ( mySFRPtr -> sfIsFolder ) || ( mySFRPtr -> sfIsVolume ) ) {
-
- memcopy ( mySFRPtr -> sfFile . name , selectedName ,
- mySFRPtr -> sfFile . name [ 0 ] + 1 ) ;
- gVRefNum = mySFRPtr -> sfFile . vRefNum ;
- gDirID = mySFRPtr -> sfFile . parID ;
-
- } else {
-
- pb . hFileInfo . ioCompletion = NULL ;
- pb . hFileInfo . ioNamePtr = selectedName ;
- pb . hFileInfo . ioVRefNum = mySFRPtr -> sfFile . vRefNum ;
- pb . hFileInfo . ioFDirIndex = -1 ;
- pb . hFileInfo . ioDirID = mySFRPtr -> sfFile . parID ;
-
- err = PBGetCatInfo ( & pb , 0 ) ;
- if ( err ) {
- gDirSelectionFlag = 0 ;
- } else {
- gDirSelectionFlag = 1 ;
- }
- gVRefNum = pb . hFileInfo . ioVRefNum ;
- gDirID = pb . dirInfo . ioDrParID ;
- }
-
- // change folder name in button title as needed
-
- if ( ! EqualString ( gPrevSelectedName , selectedName , 0 , 1 ) ) {
- SetButtonTitle ( h , selectedName , & r ) ;
- }
-
- switch ( item ) {
-
- case kGetDirBTN : // Force return by faking a cancel
- gDirSelectionFlag = 1 ;
- retVal = sfItemCancelButton ;
- break ;
-
- case sfItemCancelButton : // Real cancel ; fill in global
- gDirSelectionFlag = 0 ;
- gCancelled = 1 ;
- break ;
-
- case kNewDirBTN : // Make New Folder
- MakeNewFolder ( ) ;
- retVal = sfHookRebuildList ;
- break ;
- }
- }
- }
-
- return retVal ;
- }
-
-
- static Boolean
- GetAFolder ( short * vol , long * dir , long * par , unsigned char * name ,
- unsigned char * prompt )
- {
- Point where = { -1 , -1 } ;
- Boolean hasMoof = 0 ;
- StandardFileReply sfr ;
-
- gCancelled = 0 ;
- GetIndString ( gSelDirStrOne , 1025 , 1 ) ;
- GetIndString ( gSelDirStrTwo , 1025 , 2 ) ;
- gPromptString = prompt ;
-
- CustomGetFile ( ( void * ) MyCustomGetDirectoryFileFilter , -1 , NULL , & sfr ,
- kGetFolderDLOG , where , ( void * ) MyCustomGetDirectoryDlogHook , NULL , NULL ,
- NULL , & sfr ) ;
-
- if ( gDirSelectionFlag && ! gCancelled ) {
-
- memcopy ( gPrevSelectedName , name , gPrevSelectedName [ 0 ] + 1 ) ;
- hasMoof = 1 ;
- // * vol = sfr . sfFile . vRefNum ;
- // * dir = sfr . sfFile . parID ;
- * vol = gVRefNum ;
- * par = gDirID ;
-
- if ( sfr . sfIsVolume ) {
-
- name [ ++ name [ 0 ] ] = ':' ;
- * par = 0 ;
- }
- {
- CInfoPBRec info ;
- info . hFileInfo . ioCompletion = 0 ;
- info . hFileInfo . ioFDirIndex = 0 ;
- info . hFileInfo . ioDirID = * par ;
- info . hFileInfo . ioVRefNum = * vol ;
- info . hFileInfo . ioNamePtr = gPrevSelectedName ;
- if ( ! PBGetCatInfo ( & info , 0 ) ) {
- * dir = info . dirInfo . ioDrDirID ;
- }
- }
- }
- gDirSelectionFlag = 0 ;
-
- return hasMoof && ! gCancelled ;
- }
-
-
- Boolean
- GetAFolderFSS ( FSSpec * fss , unsigned char * prompt )
- {
- long dirID ;
-
- return GetAFolder ( & ( fss -> vRefNum ) , & dirID , & ( fss -> parID ) ,
- fss -> name , prompt ) ;
- }
-
-
- short
- GetVolName ( short vol , unsigned char * name )
- {
- short err ;
- HVolumeParam hv ;
-
- BlockClear ( hv ) ;
-
- hv . ioNamePtr = name ;
- hv . ioVRefNum = vol ;
-
- CHECK ( PBHGetVInfoSync ( ( void * ) & hv ) ) ;
-
- return 0 ;
-
- erret :
-
- return err ;
- }
-
-
- short
- GetFolderName ( short vol , long dir , unsigned char * name )
- {
- BlockClear ( sInfo ) ;
-
- sInfo . hFileInfo . ioNamePtr = name ;
- sInfo . hFileInfo . ioVRefNum = vol ;
- sInfo . hFileInfo . ioDirID = dir ;
- sInfo . hFileInfo . ioFDirIndex = -1 ;
-
- return PBGetCatInfoSync ( & sInfo ) ;
- }
-
-
- short
- TouchFolder ( short vRefNum , long dirID )
- {
- short err ;
-
- BlockClear ( sInfo ) ;
-
- sInfo . hFileInfo . ioNamePtr = sStr ;
- sInfo . hFileInfo . ioDirID = dirID ;
- sInfo . hFileInfo . ioVRefNum = vRefNum ;
- sInfo . hFileInfo . ioFDirIndex = -1 ;
-
- err = PBGetCatInfoSync ( & sInfo ) ;
-
- if ( ! err ) {
-
- sInfo . hFileInfo . ioCompletion = 0 ;
- sInfo . hFileInfo . ioFVersNum = 0 ;
- GetDateTime ( & sInfo . hFileInfo . ioFlMdDat ) ;
- err = PBSetCatInfoSync ( & sInfo ) ;
- }
-
- return err ;
- }
-
-
- short
- GetVolNum ( unsigned char * findName , unsigned long date , short * vol )
- {
- int ix ;
- short err ;
- HVolumeParam hv ;
- unsigned char name [ 64 ] ;
-
- BlockClear ( hv ) ;
-
- for ( ix = 1 ; ix > 0 ; ix ++ ) {
-
- hv . ioNamePtr = name ;
- hv . ioVRefNum = 0x8000 ;
- hv . ioVolIndex = ix ;
-
- CHECK ( PBHGetVInfoSync ( ( void * ) & hv ) ) ;
-
- if ( ! IUEqualString ( name , findName ) ) {
-
- if ( date == hv . ioVCrDate || ! date ) {
-
- * vol = hv . ioVRefNum ;
- goto isOK ;
- }
- }
- }
- err = nsvErr ;
- goto erret ;
-
- isOK :
-
- return 0 ;
-
- erret :
-
- return err ;
- }
-